home *** CD-ROM | disk | FTP | other *** search
- #! /usr/local/bin/expect
- # TSO login script, which runs as a peer of x3270.
- # expect version
-
- # Set up login parameters
- set tcp_host ibmhost
- set dial_user VTAM
- set sna_host TSO
- set userid USERID
- set password PASSWORD
-
- # Send x3270 Enter.
- proc x3270_enter {} {
- send "Enter()\r"
- expect "*ok\r\n"
- }
-
- # Fetch text from the screen.
- proc x3270_ascii {coords} {
- send "Ascii($coords)\r"
- expect {
- -re "data: (.*)\r\n.*\r\nok\r\n$" {
- return $expect_out(1,string)
- }
- }
- send_user "Ascii failed.\n"
- }
-
- # Display an error message and exit.
- proc x3270_error {text} {
- global spid
- send "Info(\042$text\042)\r"
- expect "*ok\r\n"
- send "CloseScript\r"
- expect "*ok\r\n"
- close -i $spid
- exit
- }
-
- #############################################################################
- # Start of main procedure.
-
- # Start x3270
- set stty_init -echo
- spawn -noecho -ignore SIGHUP x3270 -script -model 2 -color
- set spid $spawn_id
-
- # Connect to host
- set connected 0
- while {$connected == 0} {
- send "Connect($tcp_host)\r" ; send "Wait()\r"
- expect {
- "U F U C($tcp_host)*" {
- set connected 1
- }
- default {
- send "Disconnect()\r"
- expect "*ok\r\n"
- exec sleep 3
- }
- }
- }
-
- # Get to a VM command screen
- x3270_enter
-
- # Wait for VM's prompt
- set enter 0
- while {$enter==0} {
- if {"[x3270_ascii 1,0,5]" == "Enter"} {set enter 1} {sleep 2}
- }
-
- # Dial out to VTAM
- send "String(\042DIAL $dial_user\042)\r"
- expect "*ok\r\n"
- x3270_enter
-
- # No proper way I can think of to do this: let the DIAL command digest
- exec sleep 2
-
- # "DIALED TO xxx" may momentarily flash
- set dialed 0
- while {$dialed==0} {
- if {"[x3270_ascii 8,0,80]" == "DIALED TO $dial_user"} {exec sleep 2} {set dialed 1}
- }
-
- # Make sure we are dialed to VTAM
- if {"[x3270_ascii 0,64,4]" != "VTAM"} { x3270_error "Couldn't get to VTAM" }
-
- # Get to the SNA host
- send "String(\042$sna_host $userid\042)\r"
- x3270_enter
-
- # Pass VTAM digestion message
- set digested 0
- while {$digested==0} {
- if {"[x3270_ascii 0,21,20]" == "USS COMMAND HAS BEEN"} {exec sleep 2} {set digested 1}
- }
-
- # Now verify the "TSO/E LOGON" screen
- if {"[x3270_ascii 0,33,11]" != "TSO/E LOGON"} {
- x3270_error "Couldn't get to TSO logon screen"
- }
-
- # Pump in the password
- send "String($password)\r"
- x3270_enter
-
- # Now look for "LOGON IN PROGRESS"
- set timeout 600
- set sl [expr "18 + [string length $userid]"]
- if {"[x3270_ascii 0,11,$sl]" != "$userid LOGON IN PROGRESS"} {
- x3270_error "Couldn't log on"
- }
-
- # Make sure TSO is waiting for a '***' enter
- set timeout 10
- send "\r"
- expect {
- -re ".* (.*) 0x.*\r\nok\r\n" {
- if {$expect_out(1,string) != "5" } {
- x3270_error "Don't understand logon screen"
- }
- }
- }
-
- # Off to ISPF
- x3270_enter
-
- # We're in; exit the script and let the user interact.
- send "CloseScript\r"
- expect "*ok\r\n"
- close -i $spid
- exit
-